package com.zwx.string.leetcode_5;

/**
 * 字符串转整数（atoi）
 * 实现atoi，将字符串转为整数
 * 输入: "42"
 * 输出: 42
 * <p>
 * 输入: "   -42"
 * 输出: -42
 * 解释: 第一个非空白字符为 '-', 它是一个负号。
 * 我们尽可能将负号与后面所有连续出现的数字组合起来，最后得到 -42 。
 * <p>
 * 输入: "4193 with words"
 * 输出: 4193
 * 解释: 转换截止于数字 '3' ，因为它的下一个字符不为数字。
 * <p>
 * 输入: "words and 987"
 * 输出: 0
 * 解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
 * 因此无法执行有效的转换。
 * <p>
 * 输入: "-91283472332"
 * 输出: -2147483648
 * 解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
 * 因此返回 INT_MIN (−231) 。
 *
 * @author 文希
 * @create 2019-07-02 0:06
 */
public class StringToInteger {

    /**
     * 记录字符串中的有效数字，按位转化。需要注意整数溢出的问题
     */
    private static Integer string2Integer(String s) {
        if (s.isEmpty()) {
            return 0;
        }
        int flag = 1, i = 0;
        long result = 0;
        // 计算空格数
        while (i < s.length() && s.charAt(i) == ' ') {
            i++;
        }
        // 若全部是空格就返回0
        if (i == s.length())
            return 0;
        if (s.charAt(i) == '+' || s.charAt(i) == '-') {
            flag = s.charAt(i) == '+' ? 1 : -1;
            i++;
        }
        while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
            result = 10 * result + (s.charAt(i++) - '0');
            if (result > Integer.MAX_VALUE) {
                return flag == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
        }
        return Integer.parseInt(String.valueOf(result * flag));
    }

    public static void main(String[] args) {
        String s = "-4 5a";
        Integer integer = string2Integer(s);
        System.out.println("integer = " + integer);
    }
}
